﻿using FluentScheduler;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLL.JobService
{
    /// <summary>
    /// 任务注册
    /// </summary>
    public class JobRegistry: Registry
    {
        /// <summary>
        /// 构造中初始化各项任务
        /// <para>本类为入口类 , JobList文件夹下存放各种任务 , 在此处集中调用</para>
        /// <para>注意 : FluentScheduler使用多线程 , 并没有http请求上下文(httpContext) , 使用httpContext相关会报错</para>
        /// <para>为了防止无人请求站点导致任务失效 , 需要在IIS中设置应用程序池 启动模式为 AlwaysRunning , 虚拟主机可能会不支持 , 请确认使用环境</para>
        /// <para>为了防止无人请求站点导致任务失效 , 需要在IIS中设置应用程序池 启动模式为 AlwaysRunning , 虚拟主机可能会不支持 , 请确认使用环境</para>
        /// <para>为了防止无人请求站点导致任务失效 , 需要在IIS中设置应用程序池 启动模式为 AlwaysRunning , 虚拟主机可能会不支持 , 请确认使用环境</para>
        /// </summary>
        public JobRegistry()
        {
            #region 用法示例

            //调用方法1
            //Schedule<T>() 

            //调用方法2
            //Schedule(() => {
            //    //do something
            //})


            //互斥方式 NonReentrant() 为互斥方式 , 即当前任务如果在指定间隔未运行完成则下一次并不会触发
            //Schedule<MyJob>().NonReentrant();

            //// 立即执行每10秒一次的计划任务。（指定一个时间间隔运行，根据自己需求，可以是秒、分、时、天、月、年等。）
            //Schedule<MyJob>().ToRunNow().AndEvery(10).Seconds();

            //// 立即执行每10秒一次的计划任务。如果本次任务没有结束，下一次的任务则不会开始，禁止并行运行
            //Schedule<MyJob>().NonReentrant().ToRunNow().AndEvery(10).Seconds();

            ////在每天的21：15执行计划任务
            //Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15);

            //// 立即执行一个在每月的第一个星期一 3:00 的计划任务
            //Schedule(() => Console.WriteLine("It's 3:00 AM now.")).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);

            ////在每周一的21：15执行计划任务
            //Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);

            //// 每2秒一次循环
            //Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();

            //// 5秒后，只运行一次
            //Schedule<MyJob>().ToRunOnceIn(5).Seconds();

            ////先执行第一个Job、再执行第二个Job;完成后等5秒继续循环
            //Schedule<MyJob1>().AndThen<MyJob2>().ToRunNow().AndEvery(5).Seconds();
            #endregion

            //立即执行每10秒一次的计划任务。
            //Schedule<JobList.Default>().ToRunNow().AndEvery(10).Seconds();



            Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15);
        }
    }
}
